已經建立了 LINE BOT 的 Channel 之後,下一步就是要將 LINE BOT 串接 Webhook,讓 LINE 聊天的訊息能夠透過 Webhook 傳遞到用 Python 編輯的程式去做處理,這篇教學將會介紹如何產生 Webhook,以及如何串接 Webhook。
- 原文參考:建立並串接 Webhook
- 完整教學:LINE BOT 教學
Webhook 指的是一個「網址」,透過伺服器建立 Webhook 網址後,有串接 Webhook 的位置就能使用 HTTP 的 POST 方法,向伺服器傳送或接收特定的資料。
當使用者在 LINE 聊天室裡跟 LINE BOT 聊天,會發生下列的步驟:
- Step 1:向使用 Message API 所建立的 LINE BOT 發送訊息。
- Step 2:訊息透過 Webhook 傳遞到使用者部署 Python 程式的伺服器。
- Step 3:根據 Python 程式的邏輯,處理訊息。
- Step 4:透過 Webhook 回傳結果到 LINE BOT。
- Step 5:LINE BOT 發送訊息到 LINE 聊天室裡。
延伸「建立 LINE Channel」文章,進入自己建立的 LINE Channel,前往 Basic settings 頁籤,能夠看到 Channel secret ( 如果沒有看到或需要重新產生,點擊 Reissue 就能產生 )。
前往 Messaging API 頁籤,可以看到 Channel access token,它和 Channel secret 都是串接 LINE Channel 必須的金鑰 ( 如果沒有看到或需要重新產生,點擊 Reissue 就能產生 )。
參考 LINE 官方所提供的 Python 開發文件:LINE Messaging API SDK for Python,輸入下方的程式碼,安裝 LINE BOT 函式庫。
pip install line-bot-sdk
完成後,執行下方的程式碼就會在本機環境建立伺服器。
from flask import Flask, request
# 載入 json 標準函式庫,處理回傳的資料格式
import json
# 載入 LINE Message API 相關函式庫
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage
app = Flask(__name__)
@app.route("/", methods=['POST'])
def linebot():
body = request.get_data(as_text=True) # 取得收到的訊息內容
try:
json_data = json.loads(body) # json 格式化訊息內容
access_token = '你的 LINE Channel access token'
secret = '你的 LINE Channel secret'
line_bot_api = LineBotApi(access_token) # 確認 token 是否正確
handler = WebhookHandler(secret) # 確認 secret 是否正確
signature = request.headers['X-Line-Signature'] # 加入回傳的 headers
handler.handle(body, signature) # 綁定訊息回傳的相關資訊
tk = json_data['events'][0]['replyToken'] # 取得回傳訊息的 Token
type = json_data['events'][0]['message']['type'] # 取得 LINe 收到的訊息類型
if type=='text':
msg = json_data['events'][0]['message']['text'] # 取得 LINE 收到的文字訊息
print(msg) # 印出內容
reply = msg
else:
reply = '你傳的不是文字呦~'
print(reply)
line_bot_api.reply_message(tk,TextSendMessage(reply))# 回傳訊息
except:
print(body) # 如果發生錯誤,印出收到的內容
return 'OK' # 驗證 Webhook 使用,不能省略
if __name__ == "__main__":
app.run()
參考「使用 ngrok 服務」和「本機環境使用 ngrok」的文章內容,註冊 ngrok 服務並取得 token,並在終端機裡輸入下列指令,將本機伺服器網址指向 ngrok 網址 ( port 預設都是填入 5000 )
ngrok http <port>
完成後,就會看到終端機裡出現 ngrok 的公開網址 ( 每次重新執行後,網址都會改變 )
複製這串網址後,前往「LINE Developer 控制台」,進入自己建立的 LINE BOT Channel ( 參考:建立 LINE Channel ),在 Message API 頁籤裡找到 Webhook setting 選項,貼上 ngrok 網址 ( 注意要使用 https )。
完成後,點擊「Verify」進行驗證,如果出現 Success 文字表示已經可以正常串接。
開啟 LINE,找到 LINE BOT 的帳號,傳送訊息給 LINE BOT,LINE BOT 就會回應相同的訊息。
參考「使用 ngrok 服務」和「Google Colab 使用 ngrok」的文章內容,註冊 ngrok 服務並取得 token,接著開啟 Colab 並安裝 ngrok,安裝後使用 !pip list,會從安裝的函式庫清單中看見 flask-ngrok ( 和本機環境不同的是需要額外使用 flask-ngrok )。
參考 LINE 官方所提供的 Python 開發文件:LINE Messaging API SDK for Python,輸入下方的程式碼,安裝 LINE BOT 函式庫。
注意!Colab 閒置超過一段時間後會停止執行並清除安裝的函式庫,需要再次重新安裝。
!pip install line-bot-sdk
完成後,在 Colab 裡輸入下方的程式碼。
from flask_ngrok import run_with_ngrok
from flask import Flask, request
# 載入 LINE Message API 相關函式庫
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage
# 載入 json 標準函式庫,處理回傳的資料格式
import json
app = Flask(__name__)
@app.route("/", methods=['POST'])
def linebot():
body = request.get_data(as_text=True) # 取得收到的訊息內容
try:
json_data = json.loads(body) # json 格式化訊息內容
access_token = '你的 LINE Channel access token'
secret = '你的 LINE Channel secret'
line_bot_api = LineBotApi(access_token) # 確認 token 是否正確
handler = WebhookHandler(secret) # 確認 secret 是否正確
signature = request.headers['X-Line-Signature'] # 加入回傳的 headers
handler.handle(body, signature) # 綁定訊息回傳的相關資訊
msg = json_data['events'][0]['message']['text'] # 取得 LINE 收到的文字訊息
tk = json_data['events'][0]['replyToken'] # 取得回傳訊息的 Token
line_bot_api.reply_message(tk,TextSendMessage(msg)) # 回傳訊息
print(msg, tk) # 印出內容
except:
print(body) # 如果發生錯誤,印出收到的內容
return 'OK' # 驗證 Webhook 使用,不能省略
if __name__ == "__main__":
run_with_ngrok(app) # 串連 ngrok 服務
app.run()
點擊 Colab 的執行按鈕,就會得到一串 ngrok 對應的網址,這串網址就是要與 LINE BOT 串接的 Webhook。
複製這串網址後,前往「LINE Developer 控制台」,進入自己建立的 LINE BOT Channel ( 參考:建立 LINE Channel ),在 Message API 頁籤裡找到 Webhook setting 選項,貼上 ngrok 網址,並把 http 改為 https。
完成後,點擊「Verify」進行驗證,如果出現 Success 文字表示已經可以正常串接。
開啟 LINE,找到 LINE BOT 的帳號,傳送訊息給 LINE BOT,LINE BOT 就會回應相同的訊息。
由於使用 Colab + ngrok 所建置的 Webhook,會受限於 Colab 只能運行幾個小時,以及 ngrok 在每次部署都會改變網址的特性,所以無法當作正式的 LINE BOT Webhook ( Colab 閒置超過一段時間後還會停止執行並清除安裝的函式庫,需要再次重新安裝 )。
如果要建立一個可以 24 小時不斷運作的 LINE BOT,就可以選擇 Google Cloud Functions 作為 Python 運作的後台,參考「使用 Google Cloud Functions」文章,新增並啟用一個 Cloud Functions 程式編輯環境,環境的執行階段選擇 Python ( 3.7~3.9 皆可 ),進入點改成 linebot ( 可自訂名稱,之後的程式碼裡也要使用同樣的名稱 )。
建立編輯環境後,點擊 requirements.txt,加入 line-bot-sdk ( requirements.txt 的作用是 Cloud Functions 啟用程式時需要安裝的外部函式庫 )
點擊 main.py,輸入下方程式碼 ( 因為 Clouds Functions 的 Python 樣板是以 Flask 的基礎建立,所以不需要額外安裝 Flask )
import json
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage
def linebot(request):
try:
access_token = '你的 LINE Channel access token'
secret = '你的 LINE Channel secret'
body = request.get_data(as_text=True)
json_data = json.loads(body)
line_bot_api = LineBotApi(access_token)
handler = WebhookHandler(secret)
signature = request.headers['X-Line-Signature']
handler.handle(body, signature)
msg = json_data['events'][0]['message']['text']
tk = json_data['events'][0]['replyToken']
line_bot_api.reply_message(tk,TextSendMessage(msg))
print(msg, tk)
except:
print(request.args)
return 'OK'
完成後,點擊部署,完成後會看見出現綠色打勾的圖示。
點擊進入程式,選擇「觸發條件」,複製觸發網址 ( 這串網址就是要與 LINE BOT 串接的 Webhook )。
前往「LINE Developer 控制台」,進入自己建立的 LINE BOT Channel ( 參考:建立 LINE Channel ),在 Message API 頁籤裡找到 Webhook setting 選項,貼上網址。
完成後,點擊「Verify」進行驗證,如果出現 Success 文字表示已經可以正常串接。
開啟 LINE,找到 LINE BOT 的帳號,傳送訊息給 LINE BOT,LINE BOT 就會回應相同的訊息。
到這個步驟,應該已經建立了一個最基本的 LINE BOT ( 可以發送訊息給 LINE BOT,且 LINE BOT 也會回應同樣的訊息 ),接下來會繼續介紹更多 LINE BOT 的傳訊息方法,以及主動推播訊息的功能。
大家好,我是 OXXO,是個即將邁入中年的斜槓青年,我有個超過一千篇教學的 STEAM 教育學習網,有興趣可以參考下方連結呦~ ^_^
你好,請問我是用本機,已註冊ngork,並產生了網址,不過在連接LINE,一直驗證失敗...
出現了以下錯誤:
Error
The webhook returned an HTTP status code other than 200.(400 Bad Request)
Confirm that your bot server returns status code 200 in response to the HTTP POST request sent from the LINE Platform. For more information, see Response in the Messaging API Reference.